#include<iostream>
#include<map>
using namespace std;


//map中所有的元素都是pair 
//pair中第一个元素是key ,起到索引作用，第二个元素为value(实数)
//所有元素都会根据元素的索引自动排序 排序的是key值排序默认是升序

//map multimap 属于关联式容器，底层是用二叉树
//可以通过key值快速找到value

//map不允许容器中有重复的值


//初始化
//void Show(const map<int, string>& m)
//{
//	for (auto i : m)
//		cout << i.first << ":" << i.second << endl;
//	cout << endl;
//}
//int main()
//{
//	map<int, string>m{ {1,"hhh"},{2,"sfk"},{3,"cjh"} };
//	Show(m);
//	
//	return 0;
//}


// 想要按照key值降序排列，就使用greater<int>
//int main()
//{
//	map<int, string,greater<int>>m{ {1,"hhh"},{2,"sfk"},{3,"cjh"} };//想要按照key值降序排列，就使用greater<int>
//	for (auto i : m)
//		cout << i.first << ":" << i.second << endl;
//	cout << endl;
//	return 0;
//}

//void Show(const map<int, string>& m)
//{
//	for (auto i : m)
//		cout << i.first << " " << i.second << endl;
//	cout << endl;
//}
//
//int main()
//{
//	map<int, string>m;
//	//插入
//	m.insert({ 3,"shangxi" });//插入元素
//	m.insert({ 1,"shi" });//插入元素
//	m.insert({ 2,"shngxi" });//插入元素
//	m.insert({ 4,"sangi" });//插入元素
//	Show(m);
//
//	//删除
//
//	m.erase(1);//删除key为1的元素
//	return 0;
//
//}

//[]是map中最重要和常用的运算符, 它可以通过key访问元素。如果这个key存在则返回元素的引用, 
//如果key不存在则添加新元素。但multimap不支持[]。
//m[key], 如果这个key存在则返回元素的引用, 如果key不存在, 则插入一个新元素。
//注意m[key]中的key是关键字, 可以是任意类型, 不是下标。map和multimap没有下标访问。

//void Show(const map<int, string>& m)
//{
//	for (auto i : m)
//		cout << i.first << " " << i.second << endl;
//	cout << endl;
//}
//int main()
//{
//	map<int, string>m;
//	m.insert({ 4,"hhh" });//插入
//	m[3] = "quzijie";//注意不是3下标存放去字节，而是插入{3，quzijie}
//	m[4] = "hehonghong";//把{4，“hhh”}改为{4，"和红红"}
//	Show(m);
//
//	return 0;
//}



//find查找  查找和key相同的元素。返回找到的第一个元素迭代器,没有找到返回尾后迭代器。
// 操作步骤：1.查找的是key值 返回的是第一个元素的迭代器
//		     2.注意迭代器访问key 和value值的时候使用-> 
//void Show(const map<int, string>& m)
//{
//	for (auto i : m)
//		cout << i.first << " " << i.second << endl;
//	cout << endl;
//}
//
//int main()
//{
//	map<int, string> m;
//	m.insert({ 4,"中国" });
//	m.insert({ 3,"陕西" });
//	m.insert({ 1,"趣字节" });
//	m.insert({ 2,"张三" });
//	Show(m);
//
//	auto it = m.find(2);//查找成功
//	if (it != m.end())
//		cout << it->first << " " << it->second << endl;
//	cout << endl;
//
//	//auto it2 = m.find("中国"); //error
//
//
//
//	it = m.find(6);//查找的是key值
//	if (it == m.end())
//		cout << "没有找到关键字" << endl;
//
//
//	return 0;
//}








//void printMap(const map<int, int>& m)
//{
//	for (auto it = m.begin();it != m.end();it++)
//		cout << "key== " << (*it).first <<endl<< "value== " <<(*it).second<< endl;
//	cout << endl;
//}
//
//
//void test()
//{
//	map<int, int>m;
//	m.insert(pair<int, int>(1, 10));
//	printMap(m);
//}
//
//
//int main()
//{
//
//	test();
//	return 0;
//}


//size empty swap
//void printMap(const map<int, int>& m)
//{
//	for (auto it = m.begin();it != m.end();it++)
//		cout << "key== " << (*it).first << endl << "value== " << (*it).second << endl;
//	cout << endl;
//}
//
//
//void test()
//{
//	map<int, int>m;
//	m.insert(pair<int, int>(1, 10));
//	printMap(m);
//	cout << m.empty() << endl;
//
//	cout << m.size() << endl;
//	 
//	map<int, int>m2;
//	m2.insert(pair<int,int> (20, 20));
//	m.swap(m2);
//	printMap(m);
//	printMap(m2);
//}
//
//
//int main()
//{
//
//	test();
//	return 0;
//}







//void printMap(const map<int, int>& m)
//{
//	/*for (auto it = m.begin();it != m.end();it++)
//		cout << "key== " << (*it).first << endl << "value== " << (*it).second << endl;
//	cout << endl;*/
//
//	for (auto i : m)
//		cout << i.first <<"  "<<i.second << endl;
//}
//
//
//void test()
//{
//	map<int, int>m;
//	m.insert(pair<int, int>(1, 10));
//	m.insert(pair<int, int>(2, 20));
//	m.insert(pair<int, int>(3, 30));
//	printMap(m);
//
//	//插入和删除
//	m.insert(make_pair(2, 30)); //可以
//
//	//删除
//	m.erase(m.begin());
//	printMap(m);
//
//	//清空
//	m.erase(m.begin(), m.end());
//	m.clear();
//	printMap(m);
//}
//
//
//int main()
//{
//
//	test();
//	return 0;
//}


//map容器查找和统计

//find(key) 查找key是否存在，若存在，返回改键元素的迭代器，若不存在，则返回set.end()
//count(key) 统计key元素的个数

//map不允许插入重复的key元素，count统计 结果要么是0 要么是1 multimap的count统计可能大于1

//int main()
//{
//	map<int,int>m;
//	m.insert(make_pair(1, 10));
//	m.insert(make_pair(2, 20));
//	m.insert(make_pair(3, 30));
//
//	auto pos = m.find(3);
//	if (pos != m.end())
//		cout << "查找到了元素key=" << (*pos).first << "value=" << pos->second << endl;//可以解引用，可以用->
//	else
//		cout << "没有找到";
//
//	//注意，find不论找没有找到，都会返回一个迭代器，若找到，则返回那个map的迭代器，否则返回最后的迭代器
//}



//map容器的排序
//默认从小到大

//主要技术点：仿函数的使用
//class Mycompare
//{
//public:
//	bool operator()(int v1, int v2)
//	{
//		//降序
//		return v1 > v2;
//	}
//};
//void test()
//{
//	//利用仿函数可以进行降序
//	map<int, int,Mycompare>m;
//	m.insert(make_pair(1, 10));
//	m.insert(make_pair(2, 20));
//	m.insert(make_pair(3, 30));
//	m.insert(make_pair(4, 40));
//	m.insert(make_pair(5, 50));
//
//	//默认升序
//	for (auto it = m.begin();it != m.end();it++)
//		cout << "key=" << it->first << "value=" << it->second << endl;
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//利用仿函数可以指定map容器的排序规则
//自定义的类型，必须指定map容器的排序规则





